本篇文章在介紹 celery 的重試策略,如果有問題或是錯誤,歡迎留言討論!!
稍微在網路上搜尋了一下,Celery 的 retry 大致上可以分為兩種,第一種為調用任務時,可以設定參數,此參數主要在控制建立任務連線 (也就是派送任務時),第二種則是在任務執行的時候,任務本身發生錯誤所需要的 retry
在調用任務時,可以設定的重試參數分別有
**請注意這個方法適用在,建立與 worker 連線的時候的重試,並不是任務本身運行過程發生錯誤會重試的設定
**
下面為程式碼範例
from task import get_result
retry_policy = {'max_retries': 2,
'interval_start': 5}
test_task = get_result.apply_async((10, 0), retry=True, retry_policy=retry_policy)
若想要讓任務本身運行碰到錯誤會進行 retry 則需要在任務內進行設定
解釋:
注意:
default_retry_delay 不能寫進 retry_kwargs 內
from celery import Celery
from setting import broker_url, backend_url
from datetime import datetime
app = Celery("celery_start", broker=broker_url, backend=backend_url)
retry_kwargs = {"max_retries": 3,
"retry_backoff": False}
@app.task(bind=True, default_retry_delay=10, retry_kwargs=retry_kwargs)
def get_result(self, x, y):
print(datetime.now())
try:
tmp = x / y
return tmp
except Exception as ex:
self.retry(exc=ex)
下圖中我們可以看到,celery 在收到任務後會先執行第一次,直到碰到錯誤後,開始進行重試
因此總共執行次數為 4 次
from requests.exceptions import RequestException
@app.task(autoretry_for=RequestException)
若想自動 retry 任何錯誤則
@app.task(autoretry_for=Exception)
@app.task(retry_backoff=2)
@app.task(retry_backoff_max=600)
https://coderbook.com/@marcus/how-to-automatically-retry-failed-tasks-with-celery/